home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Taifun / Taifun 078 (1988-11-15)(Ossowski, Stefan)(DE)(PD).zip / Taifun 078 (1988-11-15)(Ossowski, Stefan)(DE)(PD).adf / Cluster / Cluster.c < prev    next >
C/C++ Source or Header  |  1988-08-14  |  7KB  |  246 lines

  1. /*
  2.  * Cluster                                         © 1988 by Unicorn Systems
  3.  * -------
  4.  * Sternhaufensimulation, systemunabhängige Funktionen und Hauptprogramm.
  5.  * Aztec C 3.6, Kickstart 1.2, Workbench 1.2
  6.  * 
  7.  * Datum:   Autor:      Aenderung:                                   Version:
  8.  * --------------------------------------------------------------------------
  9.  * 1.8.88   Roger       Programm erstellt                            1.00
  10.  *
  11.  */
  12.  
  13. /*==========================   INCLUDES/DEFINES   ==========================*/
  14.  
  15. #include <math.h>
  16. #include <stdio.h>
  17. #include <clusterDEF.h>
  18. #include <cluster.h>
  19.  
  20.  
  21. /*==========================   MODULFUNKTIONEN   ===========================*/
  22.  
  23. void main(), cluster(), ItsAllOverNowBabyBlue(), SisterMorphine(), range();
  24. int MeAndBobbyMcGee();
  25.  
  26.  
  27. /*============================    FUNKTIONEN   =============================*/
  28.  
  29. void main(argc, argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.    register int i;
  34.    register char *name = 0;
  35.    if (argc < 2)
  36.       ItsAllOverNowBabyBlue(argv[0]);
  37.    for (i = 1; i < argc; ++i)
  38.       if (**++argv == '-') {
  39.          switch (*++*argv) {
  40.             case 't':
  41.                delta = atof(*++argv);
  42.                ++i;
  43.                break;
  44.             case 'd':
  45.                nahe = atof(*++argv);
  46.                ++i;
  47.                break;
  48.             case 's':
  49.                skal = atof(*++argv);
  50.                sflag = 1;
  51.                ++i;
  52.                break;
  53.             case 'g':
  54.                guru = 0;
  55.                break;
  56.             case 'z':
  57.                zyklen = atol(*++argv);
  58.                if (zyklen > 0L)
  59.                   zykflag = 1;
  60.                ++i;
  61.                break;
  62.             default:
  63.                ItsAllOverNowBabyBlue(argv[0]);
  64.                break;
  65.          };
  66.       }
  67.       else
  68.          if (! name)
  69.             name = *argv;
  70.          else
  71.             ItsAllOverNowBabyBlue(argv[0]);
  72.    if (openIO())
  73.       if (universum(name)) {
  74.          range();
  75.          cluster();
  76.          if (! zykflag)
  77.             waitkey();
  78.       }
  79.       else
  80.          printf("Fehler in der Sterndatei.\n");
  81.    else
  82.       printf("Fehler beim öffnen des Screens / der Libraries\n");
  83.    closeIO();
  84. }
  85.  
  86.  
  87. /*
  88.  * Verfolgt die Bahnen der Sterne und berechnet neue Positionen.
  89.  */
  90.  
  91. void cluster()
  92. {
  93.    register int i, j, k;
  94.    double s, sq, as, sk = 0;
  95.    dnormal = delta;
  96.    dklein = delta / 10.0;
  97.    clear();
  98.    for (;;) {
  99.       if (getkey())
  100.          if (MeAndBobbyMcGee())
  101.             return();
  102.       if (zykflag)
  103.          if (! --zyklen)
  104.             return();
  105.       sk = BIG_VAL;
  106.       for (i = 0; i < stars; ++i) {
  107.          for (k = 0; k < 3; ++k)
  108.             acc[k][i] = 0.0;
  109.          for (j = 0; j < stars; ++j)
  110.             if (j != i) {
  111.                sq = 0.0;
  112.                for (k = 0; k < 3; ++k)
  113.                   sq += (ds[k] = pos[k][i] - pos[k][j]) * ds[k];
  114.                if (sq != 0.0) {
  115.                   if ((s = sqrt(sq)) < sk)
  116.                      sk = s;
  117.                   as = mas[i] * mas[j] * GKONST / (sq * s * (mas[i] + mas[j]));
  118.                   for (k = 0; k < 3; ++k)
  119.                      acc[k][i] += as * ds[k];
  120.                }
  121.             }
  122.          for (k = 0; k < 3; ++k)
  123.             vel[k][i] -= acc[k][i] * delta;        /* Warum '-=' ??? */
  124.          for (k = 0; k < 3; ++k)
  125.             pos[k][i] += vel[k][i] * delta;
  126.       }
  127.       alter += delta;
  128.       SisterMorphine();
  129.       if (sk < nahe)
  130.          delta = dklein;
  131.       else
  132.          delta = dnormal;
  133.    }
  134. }
  135.  
  136.  
  137. /*
  138.  * Tastenabfrage während der Simulation. d = Ein Datenfenster öffnen oder
  139.  * in das bestehende die aktuellen Simulationsdaten ausgeben. c = löschen
  140.  * des Datenfensters, aber die Simulation weiterführen. q = verlassen des
  141.  * Programmes. Wenn 'q' gewählt wurde, muss vor dem entgültigen abbrechen
  142.  * der Simulation noch eine weitere (beliebige) Taste gedrückt werden. Auf
  143.  * diese Weise kann das Schlussbild des Sternhaufens nochmals betrachtet
  144.  * werden. 
  145.  */
  146.  
  147. int MeAndBobbyMcGee()
  148. {
  149.    register int z = 0;
  150.    switch (code) {
  151.       case 'd':               /* Datenfenster öffnen */
  152.          if (! dflag)
  153.             if (! opendwin())
  154.                return(1);
  155.          dclear();
  156.          sprintf(wort, "Alter: %.4e Jahre", alter);
  157.          dprint(z++, 0);
  158.          sprintf(wort, "Zyklus: %.4e Jahre", dnormal);
  159.          dprint(z++, 0);
  160.          sprintf(wort, "Skalierung: %.4e", skal);
  161.          dprint(z++, 0);
  162.          sprintf(wort, "Objekte: %d", stars);
  163.          dprint(z++, 0);
  164.          sprintf(wort, "© 1988 Unicorn Systems");
  165.          dprint(ZEILEN - 1, 0);
  166.          return(0);
  167.          break;
  168.       case 'q':               /* Programm abbrechen */
  169.          closedwin();
  170.          return(1);
  171.          break;
  172.       case 'c':               /* Datenfenster löschen */
  173.          closedwin();
  174.          return(0);
  175.          break;
  176.       default:
  177.          return(0);
  178.          break;
  179.    };
  180. }
  181.  
  182.  
  183. /* 
  184.  * Zeigt alle Sterne in der neuen Position an. Die grösse des Angezeigten
  185.  * Ausschnittes des Sternhaufens hängt vom Skalierungsfaktor 'skal' ab.
  186.  * 'skalx' und 'skaly' sind der Auflösung entsprechende abwandlungen von
  187.  * 'skal' (so werden Verzerrungen bei NTSC-Amigas mit 200 Punkten anstelle
  188.  * von 256 Punkten ausgeschlossen).
  189.  */
  190.  
  191. void SisterMorphine()
  192. {
  193.    register int i, j;
  194.    for (i = 0; i < stars; ++i)
  195.       pixel((int) (pos[0][i] * skalx), (int) (pos[1][i] * skaly), col[i]);
  196. }
  197.  
  198.  
  199. /*
  200.  * Vergleicht alle Sternpositionen und sucht die grössten Werte für
  201.  * x, y und z-Koordinaten heraus. Durch diese Werte wird der allgemeine
  202.  * Skalierungsfaktor bestimmt, der in der Funktion 'pixel' verwendet wird.
  203.  * Der Mittelpunkt des Sternhaufens (0/0/0) liegt immer in der Mitte des
  204.  * Bildschirmes. Skalierungsfaktor: 'skal'. Diese Funktion verändert
  205.  * 'skal' nur, wenn beim Starten der Simulation kein Skalierungsfaktor 
  206.  * eingegeben wurde (sflag).
  207.  */
  208.  
  209. void range()
  210. {
  211.    register int i, j;
  212.    double max = 0.0, min = 0.0;
  213.    if (! sflag) {
  214.       for (i = 0; i < stars; ++i)
  215.          for (j = 0; j < 2; ++j)             /* Nur x und y - Koordinaten */
  216.             if (pos[j][i] > max)
  217.                max = pos[j][i];
  218.             else
  219.                if (pos[j][i] < min)
  220.                   min = pos[j][i];
  221.       min = fabs(min);
  222.       skal = (double) height / (((max > min) ? max : min) * 4.0);
  223.    }
  224.    skaly = skal;
  225.    skalx = (WIDTH / height) * skal;
  226. }
  227.  
  228.  
  229. /*
  230.  * Gibt kurze Gebrauchsanweisung aus und verlässt das Programm durch
  231.  * 'exit()'. 
  232.  */
  233.  
  234. void ItsAllOverNowBabyBlue(prg)
  235. char *prg;
  236. {
  237.    printf("Gebrauch: %s <Name> -z <cc> -t <nn> -d <dd> -s <kk> -g\n", prg);
  238.    printf("Name = Datei mit den Sterndaten.\n");
  239.    printf("-g = Guru-Sicherung: Der Screen kann verschoben werden.\n");
  240.    printf("cc = Anzahl der Zyklen. Wenn nicht vorhanden: Tastendruck\n");
  241.    printf("nn = Zeitintervall, normalwert = 1 Jahr\n");
  242.    printf("dd = Grenze von nah/fern, normalwert = 1 AE\n");
  243.    printf("kk = Skalierungsfaktor, normalwert: Automatisch\n");
  244.    exit(0);
  245. }
  246.